package br.com.virtual.cadastrar.dao.impl;

import java.util.ArrayList;
import java.util.List;

import javax.persistence.NoResultException;

import br.com.virtual.base.dao.impl.BaseDaoImpl;
import br.com.virtual.base.enums.TipoEnderecoEnum;
import br.com.virtual.cadastrar.dao.EnderecoDAO;
import br.com.virtual.cadastrar.model.Endereco;
import br.com.virtual.cadastrar.model.Pessoa;

public class EnderecoDAOImpl extends BaseDaoImpl implements EnderecoDAO {

	@Override
	public Endereco create(Endereco endereco) {

		getManager().persist(endereco);
		return endereco;
	}

	@Override
	public Endereco read(Long id) {
		return getManager().find(Endereco.class, id);
	}

	@Override
	public void update(Endereco endereco) {
		getManager().merge(endereco);
	}

	@Override
	public void delete(Endereco endereco) {

		endereco.setAtivo(false);
		this.update(endereco);
	}

	@Override
	public List<Endereco> getList(Pessoa pessoa) {
		return this
				.list(" where c.pessoa = :param and c.ativo = true ", pessoa);
	}

	private List<Endereco> list(String where, Object param) {
		return new ArrayList<Endereco>(getManager()
				.createQuery("from Endereco c " + where, Endereco.class)
				.setParameter("param", param).getResultList());
	}

	@Override
	public Endereco getEnderecoByTipo(Pessoa pessoa, TipoEnderecoEnum tipoEndereco) {

		Endereco end;
		
		try{
			end = (Endereco)getManager().createQuery("from Endereco e where pessoa = :pessoa and tipoEndereco = :tipo")
					.setParameter("pessoa", pessoa)
					.setParameter("tipo", tipoEndereco)
					.getSingleResult();
			
		}catch( NoResultException n){
			System.out.println("[getEnderecoByTipo] " + n.getMessage());
			return null;
		}
		return end;
	}

}
